﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpCommonEdit.h"
#include "IGraphicsNodeReference.h"

namespace gcmp
{
    enum class CursorType;
    class IUiView;
    class IActionInputEventArgs;
    class IPropertyPanelEventArgs;
    class IPickFilter;
    class Vector3d;
    class IGraphicsNodeGroup;
    class IControlDefinition;

    /// \brief  弧形阵列操作状态
    enum class EnRadialArrayStatus : int32_t
    {
        RES_Not_Started = 0,            ///< 初始化中
        RES_Getting_CenterPoint,        ///< 获取中心点
        RES_Getting_StartPoint,         ///< 获取弧形阵列起始位置
        RES_Getting_EndPoint,           ///< 获取终止位置
    };

    /// \brief 弧形阵列样式类别
    enum class EnRadialArrayAngleType : int32_t
    {
        RES_ANGLE_SECOND = 0,   ///< 间隔角度
        RES_ANGLE_LAST          ///< 整体角度
    };

    /// \brief 弧形阵列对话框输入事件
    enum class EnRadialPatternInputEvent : int8_t
    {
        INPUT_EVENT_RADARR_NONE                    = 0,     ///< 空事件
        INPUT_EVENT_RADARR_ROTATE_CENTER           = 1,     ///< 弧形中心类型改变
        INPUT_EVENT_RADARR_ARRAY_COUNT             = 2,     ///< 阵列个数发生改变
        INPUT_EVENT_RADARR_ARRAY_TYPE              = 3,     ///< 阵列类型改变
        INPUT_EVENT_RADARR_ANGLE                   = 4,     ///< 阵列角度值事件
    };

    /// \brief 弧形阵列定义配置结构
    typedef struct tag_InputEventReturn {
        EnRadialArrayAngleType          m_angleType;   ///< 弧形阵列类型
        double                          m_angle;       ///< 弧形阵列角度
        int                             m_arrayCount;  ///< 弧形阵列个数
        bool                            m_autoCenter;  ///< 是否自动设置弧形阵列中心点
        Vector3d                        m_centerPt;    ///< 弧形阵列中心点位置
        tag_InputEventReturn() { Reset(); }
        tag_InputEventReturn(EnRadialArrayAngleType& angleType, double& angle, int& arrayCount, bool& autoCenter)
        {
            Reset();
            m_angleType  = angleType;
            m_angle      = angle;
            m_arrayCount = arrayCount;
            m_autoCenter = autoCenter;
        }
        void Reset()
        {
            m_angleType = EnRadialArrayAngleType::RES_ANGLE_SECOND;
            m_angle = 0;                                            
            m_arrayCount = 0;                                       
            m_autoCenter = true;                                    
        }
    } sDefineConfigRPB;

    /// \brief 按照通用操作的功能特性分类，提供弧形阵列操作通用配置定制接口，系统提供默认的实现。
    class GCMP_COMMON_EDIT_EXPORT IActionRadialPatternBehavior
    {
    public:
        /// \brief 析构函数
        /// \return 
        virtual ~IActionRadialPatternBehavior() {}

#pragma region 输入对话框特性相关方法
    public:
        /// \brief 定义Action输入对话框UI
        /// \param title [out] 对话框标题
        /// \param inputItems [out] 对话框配置项UI
        /// \return 定义的结果
        virtual bool DefineInputDialog(std::wstring &title, std::vector<OwnerPtr<IControlDefinition>>& inputItems) = 0;
        /// \brief 对话框UI事件处理
        /// \param pArgs 输入事件参数
        /// \param RetValue 弧形阵列定义配置参数
        /// \return 事件响应结果成功与否
        virtual bool OnActionInputEvent(IActionInputEventArgs* pArgs, EnRadialPatternInputEvent& eventType, sDefineConfigRPB& RetValue) = 0;
#pragma endregion 输入对话框特性相关方法
        
#pragma region 通用操作（Action）状态特性方法
    public:
        /// \brief 定义提示信息
        /// \param promptMsg 提示字符串
        /// \param enStatus 阵列中间状态
        /// \return 结果状态
        virtual bool DefinePromptMsg(std::wstring& promptMsg, const EnRadialArrayStatus enStatus) = 0; 
        /// \brief 定义鼠标光标类型
        /// \param cursorType 光标类型
        /// \return 结果状态
        virtual bool DefineCursorType(CursorType& cursorType, const EnRadialArrayStatus enStatus) = 0;
        /// \brief 初始化Action
        /// \param pCurrentView 当前Action运行所属的视图
        /// \return 是否继续执行Action默认的初始化
        virtual bool OnInitAction(IUiView* pCurrentView) = 0;
        /// \brief 响应Action拾取状态改变
        /// \param pCurrentView 当前Action运行所属的视图
        /// \param enStatus 当前拾取状态
        /// \return 响应的结果
        virtual bool OnEnterGettingPointState(IUiView* pCurrentView, const EnRadialArrayStatus enStatus) = 0;
        /// \brief 响应Action操作结束
        /// \return 响应结果
        virtual bool OnActionFinished(IUiView* pCurrentView) = 0;
        /// \brief 响应Action释放
        /// \return 结果状态
        virtual bool OnDestroyAction() = 0;
#pragma endregion 通用操作（Action）状态特性方法

#pragma region 预览显示特性方法
    public:
        /// \brief 弧形阵列过程，随拾取状态变化更新预览表达数据。
        /// \param enStatus 阵列中间操作状态
        /// \param pCurrentView 当前Action运行所属的视图
        /// \param pos 本次拾取操作后，拾取点的模型空间坐标
        /// \param opGNodeGroup [in, out]用来预览的表达数据
        /// \return 是否需要Action默认的预显对象结果状态
        virtual bool GetPreviewGRepOnPickPointUpdated(EnRadialArrayStatus& enStatus, IUiView* pCurrentView, const Vector3d& pos, OwnerPtr<IGraphicsNodeGroup>& opGNodeGroup) = 0;
#pragma endregion 预览显示特性方法
    
#pragma region 该操作特有的特性方法
    public:
        /// \brief Action成功执行后，生成弧形阵列
        /// \param pCurrentView 当前Action运行所属的视图
        /// \param selectedModelIds Action中拾取的元素
        /// \param rotateAxis 弧形阵列旋转方向轴
        /// \param RetValue 弧形阵列定义配置参数
        /// \return 阵列操作结果
        virtual int RadialArrayElements(IUiView* pCurrentView, std::vector<ElementId>& selectedModelIds, const Vector3d& rotateAxis, sDefineConfigRPB RetValue) = 0;
#pragma endregion 该操作特有的特性方法
    };
}
